home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE6p.s < prev    next >
Text File  |  1994-07-28  |  7KB  |  224 lines

  1.  
  2. ; Lezione6p.s    STAMPIAMO LO SCHERMO UN CARATTERE OGNI FOTOGRAMMA
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. Inizio:
  7.     move.l    4.w,a6        ; Execbase
  8.     jsr    -$78(a6)    ; Disable
  9.     lea    GfxName(PC),a1    ; Nome lib
  10.     jsr    -$198(a6)    ; OpenLibrary
  11.     move.l    d0,GfxBase
  12.     move.l    d0,a6
  13.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  14.  
  15. ;     PUNTIAMO IL NOSTRO BITPLANE
  16.  
  17.     MOVE.L    #BITPLANE,d0
  18.     LEA    BPLPOINTERS,A1
  19.     move.w    d0,6(a1)
  20.     swap    d0
  21.     move.w    d0,2(a1)
  22.  
  23.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  24.     move.w    d0,$dff088        ; Facciamo partire la COP
  25.     move.w    #0,$dff1fc        ; Disattiva l'AGA
  26.     move.w    #$c00,$dff106        ; Disattiva l'AGA
  27.  
  28. mouse:
  29.     cmpi.b    #$ff,$dff006    ; Linea 255?
  30.     bne.s    mouse
  31.  
  32.     bsr.s    PrintCarattere    ; Stampa un carattere alla volta
  33.  
  34. Aspetta:
  35.     cmpi.b    #$ff,$dff006    ; linea 255?
  36.     beq.s    Aspetta
  37.  
  38.     btst    #6,$bfe001    ; mouse premuto?
  39.     bne.s    mouse
  40.  
  41.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  42.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  43.  
  44.     move.l    4.w,a6
  45.     jsr    -$7e(a6)    ; Enable
  46.     move.l    gfxbase(PC),a1
  47.     jsr    -$19e(a6)    ; Closelibrary
  48.     rts
  49.  
  50. ;    Dati
  51.  
  52. GfxName:
  53.     dc.b    "graphics.library",0,0
  54.  
  55. GfxBase:
  56.     dc.l    0
  57.  
  58. OldCop:
  59.     dc.l    0
  60.  
  61.  
  62. ;    Questa routine e' una specie di ibrido tra la routine normale del
  63. ;    PRINT e quella della TABELLA, infatti utiliziamo il TESTO in maniera
  64. ;    analoga ad una tabella, prendendone un valore solamente ogni FOTOGRAMMA
  65. ;    e stampandolo. D'altronde dobbiamo salvare anche l'indirizzo nel
  66. ;    bitplane dell'ultima posizione raggiunta nel print, per stampare il
  67. ;    carattere seguente dopo quello precedente. Per mantenere tra un frame
  68. ;    e l'altro l'indirizzo del carattere nel testo e del punto del bitplane
  69. ;    dove siamo arrivati sono usate 2 longword PUNTATORI:
  70. ;
  71. ; PuntaTesto:
  72. ;    dc.l    TESTO
  73. ;
  74. ; PuntaBitplane:
  75. ;    dc.l    BITPLANE
  76. ;
  77. ;    Ogni volta che la routine viene eseguita viene stampato un solo
  78. ;    carattere e viene aggiornato sia il puntatore del TESTO, con un
  79. ;    ADDQ.L #1 che lo sposta al carattere dopo (essendo un carattere
  80. ;    lungo un byte), sia il puntatore del BITPLANE, infatti ogni carattere
  81. ;    ha il suo posto nel bitplane.
  82. ;    Il primo problema e' che ogni 40 caratteri bisogna "ANDARE A CAPO",
  83. ;    ossia aggiungere 40*7 al puntatore del BITPLANE. Per risolvere questo
  84. ;    e' bastato aggiungere uno ZERO alla fine di ogni riga di testo e
  85. ;    delle istruzioni che controllano se il byte da stampare e' zero: se
  86. ;    si tratta dello zero allora significa che siamo alla fine della riga,
  87. ;    dunque viene aggiunto 40*7 al puntatore bitplane ed 1 a quello testo
  88. ;    per saltare lo zero e puntare al primo carattere della riga dopo.
  89. ;    Il secondo problema e' che una volta raggiunta la fine del testo
  90. ;    bisogna smettere di stampare caratteri. Per convenzione terminando
  91. ;    la riga con $FF anziche' con $00 indichiamo la fine del testo, basta
  92. ;    controllare se il byte da leggere e' $FF e uscire senza stampare e
  93. ;    senza far avanzare il puntatore PUNTATESTO, per cui ogni volta che
  94. ;    viene eseguito PRINTcarattere dopo aver stampato l'intero testo usciamo
  95. ;    senza compiere operazioni, in quanto il carattere e' sempre $FF.
  96. ;    NOTA: potete "inventare" vari numeri "speciali" da inserire nel
  97. ;    testo per varie funzioni, basta che non siano numeri compresi tra $20
  98. ;    e $80, ossia tra i byte dedicati ai caratteri.
  99.  
  100. PRINTcarattere:
  101.     MOVE.L    PuntaTESTO(PC),A0 ; Indirizzo del testo da stampare in a0
  102.     MOVEQ    #0,D2        ; Pulisci d2
  103.     MOVE.B    (A0)+,D2    ; Prossimo carattere in d2
  104.     CMP.B    #$ff,d2        ; Segnale di fine testo? ($FF)
  105.     beq.s    FineTesto    ; Se si, esci senza stampare
  106.     TST.B    d2        ; Segnale di fine riga? ($00)
  107.     bne.s    NonFineRiga    ; Se no, non andare a capo
  108.  
  109.     ADD.L    #40*7,PuntaBITPLANE    ; ANDIAMO A CAPO
  110.     ADDQ.L    #1,PuntaTesto        ; primo carattere riga dopo
  111.                     ; (saltiamo lo ZERO)
  112.     move.b    (a0)+,d2        ; primo carattere della riga dopo
  113.                     ; (saltiamo lo ZERO)
  114.  
  115. NonFineRiga:
  116.     SUB.B    #$20,D2        ; TOGLI 32 AL VALORE ASCII DEL CARATTERE, IN
  117.                 ; MODO DA TRASFORMARE, AD ESEMPIO, QUELLO
  118.                 ; DELLO SPAZIO (che e' $20), in $00, quello
  119.                 ; DELL'ASTERISCO ($21), in $01...
  120.     MULU.W    #8,D2        ; MOLTIPLICA PER 8 IL NUMERO PRECEDENTE,
  121.                 ; essendo i caratteri alti 8 pixel
  122.     MOVE.L    D2,A2
  123.     ADD.L    #FONT,A2    ; TROVA IL CARATTERE DESIDERATO NEL FONT...
  124.  
  125.     MOVE.L    PuntaBITPLANE(PC),A3 ; Indir. del bitplane destinazione in a3
  126.  
  127.                 ; STAMPIAMO IL CARATTERE LINEA PER LINEA
  128.     MOVE.B    (A2)+,(A3)    ; stampa LA LINEA 1 del carattere
  129.     MOVE.B    (A2)+,40(A3)    ; stampa LA LINEA 2  " "
  130.     MOVE.B    (A2)+,40*2(A3)    ; stampa LA LINEA 3  " "
  131.     MOVE.B    (A2)+,40*3(A3)    ; stampa LA LINEA 4  " "
  132.     MOVE.B    (A2)+,40*4(A3)    ; stampa LA LINEA 5  " "
  133.     MOVE.B    (A2)+,40*5(A3)    ; stampa LA LINEA 6  " "
  134.     MOVE.B    (A2)+,40*6(A3)    ; stampa LA LINEA 7  " "
  135.     MOVE.B    (A2)+,40*7(A3)    ; stampa LA LINEA 8  " "
  136.  
  137.     ADDQ.L    #1,PuntaBitplane ; avanziamo di 8 bit (PROSSIMO CARATTERE)
  138.     ADDQ.L    #1,PuntaTesto    ; prossimo carattere da stampare
  139.  
  140. FineTesto:
  141.     RTS
  142.  
  143.  
  144. PuntaTesto:
  145.     dc.l    TESTO
  146.  
  147. PuntaBitplane:
  148.     dc.l    BITPLANE
  149.  
  150. ;    $00 per "fine linea" - $FF per "fine testo"
  151.  
  152.         ; numero caratteri per linea: 40
  153. TESTO:         ;          1111111111222222222233333333334
  154.     dc.b    '   PRIMA RIGA                           ',0 ; 1
  155.     dc.b    '                SECONDA RIGA            ',0 ; 2
  156.     dc.b    '     /\  /                              ',0 ; 3
  157.     dc.b    '    /  \/                               ',0 ; 4
  158.     dc.b    '                                        ',0 ; 5
  159.     dc.b    '        SESTA RIGA                      ',0 ; 6
  160.     dc.b    '                                        ',0 ; 7
  161.     dc.b    '                                        ',0 ; 8
  162.     dc.b    'FABIO CIUCCI COMMUNICATION INTERNATIONAL',0 ; 9
  163.     dc.b    '                                        ',0 ; 10
  164.     dc.b    '   1234567890 !@#$%^&*()_+|\=-[]{}      ',0 ; 11
  165.     dc.b    '                                        ',0 ; 12
  166.     dc.b    '     LA PALINGENETICA OBLITERAZIONE     ',0 ; 15
  167.     dc.b    '                                        ',0 ; 16
  168.     dc.b    '                                        ',0 ; 17
  169.     dc.b    '  Nel mezzo del cammin di nostra vita   ',0 ; 18
  170.     dc.b    '                                        ',0 ; 19
  171.     dc.b    '    Mi RitRoVaI pEr UnA sELva oScuRa    ',0 ; 20
  172.     dc.b    '                                        ',0 ; 21
  173.     dc.b    '    CHE LA DIRITTA VIA ERA SMARRITA     ',0 ; 22
  174.     dc.b    '                                        ',0 ; 23
  175.     dc.b    '  AHI Quanto a DIR QUAL ERA...          ',$FF ; 24 FINE
  176.  
  177.  
  178.     EVEN
  179.  
  180.  
  181.  
  182.     SECTION    GRAPHIC,DATA_C
  183.  
  184. COPPERLIST:
  185.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  186.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  187.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  188.     dc.w    $13e,0
  189.  
  190.     dc.w    $8E,$2c81    ; DiwStrt
  191.     dc.w    $90,$2cc1    ; DiwStop
  192.     dc.w    $92,$0038    ; DdfStart
  193.     dc.w    $94,$00d0    ; DdfStop
  194.     dc.w    $102,0        ; BplCon1
  195.     dc.w    $104,0        ; BplCon2
  196.     dc.w    $108,0        ; Bpl1Mod
  197.     dc.w    $10a,0        ; Bpl2Mod
  198.             ; 5432109876543210
  199.     dc.w    $100,%0001001000000000    ; 1 bitplane LOWRES 320x256
  200.  
  201. BPLPOINTERS:
  202.     dc.w $e0,0,$e2,0    ;primo     bitplane
  203.  
  204.     dc.w    $0180,$000    ; color0 - SFONDO
  205.     dc.w    $0182,$19a    ; color1 - SCRITTE
  206.  
  207.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  208.  
  209. ;    Il FONT caratteri 8x8
  210.  
  211. FONT:
  212.     incbin    "metal.fnt"
  213. ;    incbin    "normal.fnt"
  214. ;    incbin    "nice.fnt"
  215.  
  216.  
  217.     SECTION    MIOPLANE,BSS_C
  218.  
  219. BITPLANE:
  220.     ds.b    40*256    ; un bitplane lowres 320x256
  221.  
  222.     end
  223.  
  224.